﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SW2A311A
{
    public abstract class Dryer : Product, IEnergyClass
    {
        #region Instansvariabler
        public Dimensions Dimension
        {
            get { return _dimension; }
            private set { _dimension = value; }
        }
        private Dimensions _dimension;

        public EEnergyClass EnergyClass;

        public double Capacity           // Checker for at se om kapaciteten er større end 0, da kapaciten ikke kan være mindre, hvis den er blvier der kastet en exception.
        {
            get { return _Capacity; }
            private set
            {
                if (value > 0)
                    _Capacity = value;
                else
                    throw new ArgumentOutOfRangeException("Capacity", "Skal være positivt tal");
            }
        }
        private double _Capacity;

        public int DryTime              // Checker om tørretiden er et positivt tal,da tørretiden ikke kan være minus tid, hvis den er bliver der kaestet en exception.
        {
            get { return _DryTime; }
            private set
            {
                if (value > 0)
                    _DryTime = value;
                else
                    throw new ArgumentOutOfRangeException("DryTime", "Skal være positivt tal");
            }
        }
        private int _DryTime;

        public double EnergyConsumption
        {
            get
            {
                return _EnergyConsumption;
            }
            private set
            {                               // Kan ikke bruge minus energi, hvis den gør kommer der en exception.
                if (value > 0)
                    _EnergyConsumption = value;
                else
                    throw new ArgumentOutOfRangeException("EnergyConsumption", "Skal være positivt tal");
            }
        }
        private double _EnergyConsumption;

        public double NoiseLevel //Skal stemme overens til krav til lydniveau sat i NoiseLevelCalc klassen
        {
            get { return _noiseLevel; }
            private set { _noiseLevel = NoiseLevelCalc.Set(value); }
        }
        private double _noiseLevel;
        #endregion

        #region Constructors
        // Dryer instantieres med indput parametre til alle fields og proporties, 
        // og sender dem videre til superklassen Product.
        public Dryer(string name, double price, Dimensions dimension, double capacity,
            int dryTime, double energyConsumption, int noiseLevel)
            : base(name, price)
        {
            Dimension = dimension;
            Capacity = capacity;
            DryTime = dryTime;
            Dimension = dimension;
            EnergyConsumption = energyConsumption;
            NoiseLevel = noiseLevel;
        }
        #endregion

        #region Metoder
        public abstract EEnergyClass GetEnergyClass();

        #region Equals metoder
        public override bool Equals(object obj)
        {
            Dryer p = obj as Dryer;

            if (this.GetType() != obj.GetType())
                return false;

            return base.Equals(obj) &&
                Dimension.Equals(p.Dimension) &&
                EnergyClass == p.EnergyClass &&
                DryTime == p.DryTime &&
                Capacity == p.Capacity &&
                EnergyConsumption == p.EnergyConsumption &&
                NoiseLevel == p.NoiseLevel;
        }

        public bool Equals(Dryer p)
        {
            return base.Equals((Product)p) &&
                Dimension.Equals(p.Dimension) &&
                EnergyClass == p.EnergyClass &&
                DryTime == p.DryTime &&
                Capacity == p.Capacity &&
                EnergyConsumption == p.EnergyConsumption &&
                NoiseLevel == p.NoiseLevel;
        }

        public override int GetHashCode()
        {
            return base.GetHashCode() ^
                Dimension.GetHashCode() ^
                EnergyClass.GetHashCode() ^
                DryTime.GetHashCode() ^
                Capacity.GetHashCode() ^
                EnergyConsumption.GetHashCode() ^
                NoiseLevel.GetHashCode();
        }
        #endregion
        #endregion
    }
}
